# -*- coding: utf-8 -*-
'''
@authors 12551 Pedro Santos && 12552 Emanuel Teixeira
@date 8 de novembro de 2013
@obs: Criação de gráficos referentes
as estatisticas pretendidas
'''
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
from pylab import *
from matplotlib import font_manager as fm
from matplotlib.transforms import Affine2D
from matplotlib.patches import Circle, Wedge, Polygon
from datetime import datetime, date
import csv
import os

def autolabel(rects):
	'''
	Método que adiciona o valor da barra no seu topo

	@param rects lista de barras do gráfico a colocar as labels 
	'''
    # attach some text labels
	for rect in rects:
		height = rect.get_height()
		ax.text(rect.get_x()+rect.get_width()/2., height, '%d'%int(height), ha='center', va='bottom')

def graf_especial(inst, resultados):
	'''
	Método que constroi um gráfico apenas para uma instituição
	com duas barras. Os Alunos colocados e as vagas sobrantes.

	@param inst nome da instituição
	@param resultados lista com as estatisticas da instituição
	'''
	N = 1
	colocadosMeans = (resultados[0])
	colocadosStd =   (0)
	ind = np.arange(N)  # the x locations for the groups
	width = 0.35       # the width of the bars
	fig, ax = plt.subplots()
	rects1 = ax.bar(ind, colocadosMeans, width, color='r', yerr=colocadosStd)
	sobrantesMeans = (resultados[1])
	sobrantesStd =   (0)
	rects2 = ax.bar(ind+width, sobrantesMeans, width, color='y', yerr=sobrantesStd)
	# add some
	global ax
	ax.set_ylabel('Número de alunos'.decode('utf-8'))
	ax.set_title('Resultados para: ' + inst)
	ax.legend( (rects1[0], rects2[0]), ('Colocados', 'Vagas sobrantes') )
	autolabel(rects1)
	autolabel(rects2)
	plt.show()

def criar_grafico(labels, stats, subtitles, flag=False):
	'''
	Método que constroi um grafico
	através dos parametros dados

	@labels lista de labels a atribuir as barras do gráfico
	@stats lista de valores com que cada barra vai ser contruida
	@subtitles lista com o titulo e a legenda do gráfico
	@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
	'''
	N = len(stats)
	std = []
	for i in labels:
		std.append(0)
	 	
	ind = np.arange(N)  # the x locations for the groups
	width = 0.6     # the width of the bars
	global ax
	fig, ax = plt.subplots()
	bar = ax.bar(ind + 2, stats, width, color='g', yerr=std)
	# add some
	ax.set_ylabel(subtitles[0])
	ax.set_title(subtitles[1])
	ax.set_xticks((ind+width / 2) + 2)
	ax.set_xticklabels(labels,  rotation='vertical')
	autolabel(bar)
	plt.subplots_adjust(left=0.1, right=0.95, top=0.95, bottom=0.35)
	dir = os.path.dirname('saved plots/')
	if not os.path.exists(dir):
		os.makedirs(dir)
	if(flag == True):
		plt.savefig(dir + '/' + 'plot ' + str(date.today()) + ' ' + str(datetime.now().hour) + 'h' + str(datetime.now().minute) + 'm' + str(datetime.now().second) + 's' + '.jpg')
	plt.show()

class Graficos_instituicao():
	'''
	Classe que gera gráficos para as instituições de ensino
	'''
	reader = csv.reader(open("estatisticas_instituicao.csv", "rb"))
	global labels_inst, colocados_inst, sobrantes_inst, percentagem_inst
	labels_inst = []
	colocados_inst = []
	sobrantes_inst = []
	percentagem_inst = []
	for row in reader:
		i = row[0].split(';')
		labels_inst.append(i[0].decode('utf-8'))
		colocados_inst.append(int(i[1]))
		sobrantes_inst.append(int(i[2]))
		percentagem_inst.append(float(i[3]))

	def colocados_graf(self, flag = False):
		'''
		Método que gera um gráfico para o número de colocados de cada instituição

		@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
		'''
		subtitles = []
		subtitles.append('Número de Colocados'.decode('utf-8'))
		subtitles.append('Número de Alunos colocados por instituição de ensino'.decode('utf-8'))
		criar_grafico(labels_inst, colocados_inst, subtitles, flag)

	def sobrantes_graf(self, flag=False):
		'''
		Método que gera um gráfico para o número de vagas sobrantes de cada instituição

		@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
		'''
		subtitles = []
		subtitles.append('Número de vagas sobrantes'.decode('utf-8'))
		subtitles.append('Número de vagas sobrantes por instituição de ensino'.decode('utf-8'))
		criar_grafico(labels_inst, sobrantes_inst, subtitles, flag)

	def percentagens_graf(self, flag=False):
		'''
		Método que gera um gráfico para a percentagem de colocados para cada
		instituição de ensino em relação ao concurso nacional

		@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
		'''
		subtitles = []
		subtitles.append('Percentagem de alunos colocados'.decode('utf-8'))
		subtitles.append('Percentagem de alunos colocados por instituição de ensino'.decode('utf-8'))
		criar_grafico(labels_inst, percentagem_inst, subtitles, flag)

class Graficos_distrito():
	'''
	Classe que gera gráficos para os distritos
	'''
	reader = csv.reader(open("estatisticas_distrito.csv", "rb"))
	global labels, colocados, sobrantes, permilagem
	labels = []
	colocados = []
	sobrantes = []
	permilagem = []
	for row in reader:			
		i = row[0].split(';')
		labels.append(i[0].decode('utf-8'))
		colocados.append(int(i[1]))
		sobrantes.append(int(i[2]))
		permilagem.append(float(i[3]))

	def colocados_graf(self, flag=False):
		'''
		Método que gera um gráfico para o número de colocados em cada distrito

		@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
		'''
		subtitles = []
		subtitles.append('Número de Colocados'.decode('utf-8'))
		subtitles.append('Número de Alunos colocados por distrito'.decode('utf-8'))
		criar_grafico(labels, colocados, subtitles, flag)

	def sobrantes_graf(self, flag=False):
		'''
		Método que gera um gráfico para o número de vagas sobrantes em cada distrito

		@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
		'''
		subtitles = []
		subtitles.append('Número de vagas sobrantes'.decode('utf-8'))
		subtitles.append('Número de vagas sobrantes por distrito'.decode('utf-8'))
		criar_grafico(labels, sobrantes, subtitles, flag)

	def permilagens_graf(self, flag=False):
		'''
		Método que gera um gráfico para a permilagem de colocados para cada
		distrito em relação ao concurso nacional

		@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
		'''
		subtitles = []
		subtitles.append('Permilagem de alunos colocados'.decode('utf-8'))
		subtitles.append('Permilagem de alunos colocados por distrito'.decode('utf-8'))
		criar_grafico(labels, permilagem, subtitles, flag)